package util

import (
	"fmt"
	"frontend-server/global"
	"math/rand"
	"net/smtp"
	"time"

	"github.com/gomodule/redigo/redis"
	"github.com/jordan-wright/email"
)

// 发送邮箱验证码
func SendEmailValidate(em []string) (string, error) {
	e := email.NewEmail()
	e.From = fmt.Sprintf("%s <%s>", global.App.Config.Email.Sender, global.App.Config.Email.SenderMail)
	e.To = em
	// 生成 6 位随机验证码
	rnd := rand.New(rand.NewSource(time.Now().UnixNano()))
	vCode := fmt.Sprintf("%06v", rnd.Int31n(1000000))
	t := time.Now().Format("2006-01-02 15:04:05")
	// 设置文件发送的内容
	content := fmt.Sprintf(`
		<div>
			<div>
				<h3>尊敬的%s，你好!</h3>
			</div>
			<div style="padding: 8px 40px 8px 50px;">
				<p>您于 %s 提交的邮箱验证，本次验证码为<u><strong>%s</strong></u>,为了确保账户安全，验证码有效期为 5 分钟。
			</div>
			<div>
				<p>此邮箱为系统邮箱，请勿回复</p>
			</div>
		</div>
	`, em[0], t, vCode)
	e.Text = []byte(content)
	// 设置服务器相关的配置
	err := e.Send(global.App.Config.Email.Host+":"+global.App.Config.Email.Port, smtp.PlainAuth("", global.App.Config.Email.SenderMail, global.App.Config.Email.AuthCode, global.App.Config.Email.Host))
	return vCode, err
}

// 邮箱验证码 redis 存入
func SetEmailValidate(vCode string) error {
	redisCon, err := redis.Dial(global.App.Config.Redis.Network, global.App.Config.Redis.Host+":"+global.App.Config.Redis.Port)
	if err != nil {
		panic(fmt.Sprintf("连接 redis 失败: %s", err))
	}
	_, err = redisCon.Do("set", "vCode", vCode)
	_, _ = redisCon.Do("expire", "vCode", 300)
	defer redisCon.Close()
	return err
}

// 邮箱验证码验证
func ValidateEmailCode(vCode string) (bool, error) {
	redisCon, err := redis.Dial(global.App.Config.Redis.Network, global.App.Config.Redis.Host+":"+global.App.Config.Redis.Port)
	if err != nil {
		panic(fmt.Sprintf("连接 redis 失败: %s", err))
	}

	code, _ := redisCon.Do("get", "vCode")
	defer redisCon.Close()
	if string(code.([]byte)) != "" && vCode == string(code.([]byte)) {
		return true, nil
	} else {
		return false, err
	}
}
